﻿using FlexFlow.Model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace FlexFlow.Base.Interface
{
    /// <summary>
    /// 工作流模板信息实体工厂
    /// </summary>
    public interface IFormTemplateProvider : IPhysicalEntityProvider<FormTemplate>
    {
        /// <summary>
        /// 判断指定的文件Id的文件是否已经作为模板使用
        /// </summary>
        /// <param name="fileId">
        /// 要判断的文件Id
        /// </param>
        /// <returns>
        /// 一个值，表示文件是否已经作为模板使用
        /// </returns>
        bool CheckFileInstalled(Guid fileId);
        /// <summary>
        /// 取得指定的文件安装后的表单模板
        /// </summary>
        /// <param name="fileId">
        /// 要取得的表单模板的文件ID
        /// </param>
        /// <returns>
        /// 取得的表单模板
        /// </returns>
        FormTemplate GetByFileId(Guid fileId);
        /// <summary>
        /// 取得一个未编译的模板信息并更新其编译信息为 Compiling
        /// </summary>
        /// <returns>
        /// 取得的模板信息
        /// </returns>
        FormTemplate GetAndSetState();
        /// <summary>
        /// 更新指定模板的状态及消息
        /// </summary>
        /// <param name="state">
        /// 要更新的状态
        /// </param>
        /// <param name="message">
        /// 状态消息
        /// </param>
        /// <returns>
        /// 更新是否成功
        /// </returns>
        bool UpdateState(Guid id, FormTemplateState state, string message);
        /// <summary>
        /// 查询名称中包含指定字符的表单模板集合
        /// </summary>
        /// <param name="nameLike">
        /// 要查询的表单模板名称
        /// </param>
        /// <param name="limit">
        /// 限制数量
        /// </param>
        /// <param name="skip">
        /// 返回数据的起始位置
        /// </param>
        /// <param name="isAll">
        /// 一个值，表示返回的结果是所有的表单模板还是已安装的表单模板
        /// </param>
        /// <returns>
        /// 查询结果
        /// </returns>
        List<FormTemplate> QueryByName(string nameLike, int skip = 0, int limit = 5, bool isAll = false);
    }
}
